home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / vaportra.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  10KB  |  389 lines

  1. /***************************************************************************
  2.  
  3.    Vapour Trail Video emulation - Bryan McPhail, mish@tendril.co.uk
  4.  
  5. ****************************************************************************
  6.  
  7.     2 Data East 55 chips for playfields (same as Dark Seal, etc)
  8.     1 Data East MXC-06 chip for sprites (same as Bad Dudes, etc)
  9.  
  10. ***************************************************************************/
  11.  
  12. #include "driver.h"
  13. #include "vidhrdw/generic.h"
  14.  
  15. unsigned char *vaportra_pf1_data,*vaportra_pf2_data,*vaportra_pf3_data,*vaportra_pf4_data;
  16.  
  17. static unsigned char vaportra_control_0[16];
  18. static unsigned char vaportra_control_1[16];
  19. static unsigned char vaportra_control_2[4];
  20.  
  21. static struct tilemap *pf1_tilemap,*pf2_tilemap,*pf3_tilemap,*pf4_tilemap;
  22. static unsigned char *gfx_base;
  23. static int gfx_bank,flipscreen;
  24.  
  25. static unsigned char *vaportra_spriteram;
  26.  
  27.  
  28.  
  29. /* Function for all 16x16 1024x1024 layers */
  30. static UINT32 vaportra_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
  31. {
  32.     /* logical (col,row) -> memory offset */
  33.     return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6);
  34. }
  35.  
  36. static void get_bg_tile_info(int tile_index)
  37. {
  38.     int tile,color;
  39.  
  40.     tile=READ_WORD(&gfx_base[2*tile_index]);
  41.     color=tile >> 12;
  42.     tile=tile&0xfff;
  43.  
  44.     SET_TILE_INFO(gfx_bank,tile,color)
  45. }
  46.  
  47. /* 8x8 top layer */
  48. static void get_fg_tile_info(int tile_index)
  49. {
  50.     int tile=READ_WORD(&vaportra_pf1_data[2*tile_index]);
  51.     int color=tile >> 12;
  52.  
  53.     tile=tile&0xfff;
  54.  
  55.     SET_TILE_INFO(0,tile,color)
  56. }
  57.  
  58. /******************************************************************************/
  59.  
  60. void vaportra_vh_stop (void)
  61. {
  62.     free(vaportra_spriteram);
  63. }
  64.  
  65. int vaportra_vh_start(void)
  66. {
  67.     pf1_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,64,64);
  68.     pf2_tilemap = tilemap_create(get_bg_tile_info,vaportra_scan,    TILEMAP_TRANSPARENT,16,16,64,32);
  69.     pf3_tilemap = tilemap_create(get_bg_tile_info,vaportra_scan,    TILEMAP_TRANSPARENT,16,16,64,32);
  70.     pf4_tilemap = tilemap_create(get_bg_tile_info,vaportra_scan,    TILEMAP_TRANSPARENT,16,16,64,32);
  71.  
  72.     if (!pf1_tilemap || !pf2_tilemap || !pf3_tilemap || !pf4_tilemap)
  73.         return 1;
  74.  
  75.     vaportra_spriteram = malloc(0x800);
  76.     if (!vaportra_spriteram)
  77.         return 1;
  78.  
  79.     pf1_tilemap->transparent_pen = 0;
  80.     pf2_tilemap->transparent_pen = 0;
  81.     pf3_tilemap->transparent_pen = 0;
  82.     pf4_tilemap->transparent_pen = 0;
  83.  
  84.     return 0;
  85. }
  86.  
  87. /******************************************************************************/
  88.  
  89. READ_HANDLER( vaportra_pf1_data_r )
  90. {
  91.     return READ_WORD(&vaportra_pf1_data[offset]);
  92. }
  93.  
  94. READ_HANDLER( vaportra_pf2_data_r )
  95. {
  96.     return READ_WORD(&vaportra_pf2_data[offset]);
  97. }
  98.  
  99. READ_HANDLER( vaportra_pf3_data_r )
  100. {
  101.     return READ_WORD(&vaportra_pf3_data[offset]);
  102. }
  103.  
  104. READ_HANDLER( vaportra_pf4_data_r )
  105. {
  106.     return READ_WORD(&vaportra_pf4_data[offset]);
  107. }
  108.  
  109. WRITE_HANDLER( vaportra_pf1_data_w )
  110. {
  111.     COMBINE_WORD_MEM(&vaportra_pf1_data[offset],data);
  112.     tilemap_mark_tile_dirty(pf1_tilemap,offset/2);
  113. }
  114.  
  115. WRITE_HANDLER( vaportra_pf2_data_w )
  116. {
  117.     COMBINE_WORD_MEM(&vaportra_pf2_data[offset],data);
  118.     tilemap_mark_tile_dirty(pf2_tilemap,offset/2);
  119. }
  120.  
  121. WRITE_HANDLER( vaportra_pf3_data_w )
  122. {
  123.     COMBINE_WORD_MEM(&vaportra_pf3_data[offset],data);
  124.     tilemap_mark_tile_dirty(pf3_tilemap,offset/2);
  125. }
  126.  
  127. WRITE_HANDLER( vaportra_pf4_data_w )
  128. {
  129.     COMBINE_WORD_MEM(&vaportra_pf4_data[offset],data);
  130.     tilemap_mark_tile_dirty(pf4_tilemap,offset/2);
  131. }
  132.  
  133. WRITE_HANDLER( vaportra_control_0_w )
  134. {
  135.     COMBINE_WORD_MEM(&vaportra_control_0[offset],data);
  136. }
  137.  
  138. WRITE_HANDLER( vaportra_control_1_w )
  139. {
  140.     COMBINE_WORD_MEM(&vaportra_control_1[offset],data);
  141. }
  142.  
  143. WRITE_HANDLER( vaportra_control_2_w )
  144. {
  145.     COMBINE_WORD_MEM(&vaportra_control_2[offset],data);
  146. }
  147.  
  148. /******************************************************************************/
  149.  
  150. WRITE_HANDLER( vaportra_update_sprites_w )
  151. {
  152.     memcpy(vaportra_spriteram,spriteram,0x800);
  153. }
  154.  
  155. static void update_24bitcol(int offset)
  156. {
  157.     int r,g,b;
  158.  
  159.     r = (READ_WORD(&paletteram[offset]) >> 0) & 0xff;
  160.     g = (READ_WORD(&paletteram[offset]) >> 8) & 0xff;
  161.     b = (READ_WORD(&paletteram_2[offset]) >> 0) & 0xff;
  162.  
  163.     palette_change_color(offset / 2,r,g,b);
  164. }
  165.  
  166. WRITE_HANDLER( vaportra_palette_24bit_rg_w )
  167. {
  168.     COMBINE_WORD_MEM(&paletteram[offset],data);
  169.     update_24bitcol(offset);
  170. }
  171.  
  172. WRITE_HANDLER( vaportra_palette_24bit_b_w )
  173. {
  174.     COMBINE_WORD_MEM(&paletteram_2[offset],data);
  175.     update_24bitcol(offset);
  176. }
  177.  
  178. /******************************************************************************/
  179.  
  180. static void vaportra_update_palette(void)
  181. {
  182.     int offs,color,i,pal_base;
  183.     int colmask[16];
  184.  
  185.     palette_init_used_colors();
  186.  
  187.     /* Sprites */
  188.     pal_base = Machine->drv->gfxdecodeinfo[4].color_codes_start;
  189.     for (color = 0;color < 16;color++) colmask[color] = 0;
  190.     for (offs = 0;offs < 0x800;offs += 8)
  191.     {
  192.         int x,y,sprite,multi;
  193.  
  194.         y = READ_WORD(&vaportra_spriteram[offs]);
  195.         if ((y&0x8000) == 0) continue;
  196.  
  197.         sprite = READ_WORD (&vaportra_spriteram[offs+2]) & 0x1fff;
  198.  
  199.         x = READ_WORD(&vaportra_spriteram[offs+4]);
  200.         color = (x >> 12) &0xf;
  201.  
  202.         x = x & 0x01ff;
  203.         if (x >= 256) x -= 512;
  204.         x = 240 - x;
  205.         if (x>256) continue; /* Speedup */
  206.  
  207.         multi = (1 << ((y & 0x1800) >> 11)) - 1;    /* 1x, 2x, 4x, 8x height */
  208.         sprite &= ~multi;
  209.  
  210.         while (multi >= 0)
  211.         {
  212.             colmask[color] |= Machine->gfx[4]->pen_usage[sprite + multi];
  213.             multi--;
  214.         }
  215.     }
  216.  
  217.     for (color = 0;color < 16;color++)
  218.     {
  219.         for (i = 1;i < 16;i++)
  220.         {
  221.             if (colmask[color] & (1 << i))
  222.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  223.         }
  224.     }
  225.  
  226.     if (palette_recalc())
  227.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  228. }
  229.  
  230. static void vaportra_drawsprites(struct osd_bitmap *bitmap, int pri)
  231. {
  232.     int offs,priority_value;
  233.  
  234.     priority_value=READ_WORD(&vaportra_control_2[2]);
  235.  
  236.     for (offs = 0;offs < 0x800;offs += 8)
  237.     {
  238.         int x,y,sprite,colour,multi,fx,fy,inc,flash,mult;
  239.  
  240.         y = READ_WORD(&vaportra_spriteram[offs]);
  241.         if ((y&0x8000) == 0) continue;
  242.  
  243.         sprite = READ_WORD (&vaportra_spriteram[offs+2]) & 0x1fff;
  244.         x = READ_WORD(&vaportra_spriteram[offs+4]);
  245.         colour = (x >> 12) &0xf;
  246.         if (pri && (colour>=priority_value)) continue;
  247.         if (!pri && !(colour>=priority_value)) continue;
  248.  
  249.         flash=x&0x800;
  250.         if (flash && (cpu_getcurrentframe() & 1)) continue;
  251.  
  252.         fx = y & 0x2000;
  253.         fy = y & 0x4000;
  254.         multi = (1 << ((y & 0x1800) >> 11)) - 1;    /* 1x, 2x, 4x, 8x height */
  255.  
  256.         x = x & 0x01ff;
  257.         y = y & 0x01ff;
  258.         if (x >= 256) x -= 512;
  259.         if (y >= 256) y -= 512;
  260.         x = 240 - x;
  261.         y = 240 - y;
  262.  
  263.         if (x>256) continue; /* Speedup */
  264.  
  265.         sprite &= ~multi;
  266.         if (fy)
  267.             inc = -1;
  268.         else
  269.         {
  270.             sprite += multi;
  271.             inc = 1;
  272.         }
  273.  
  274.         if (flipscreen)
  275.         {
  276.             y=240-y;
  277.             x=240-x;
  278.             if (fx) fx=0; else fx=1;
  279.             if (fy) fy=0; else fy=1;
  280.             mult=16;
  281.         }
  282.         else mult=-16;
  283.  
  284.         while (multi >= 0)
  285.         {
  286.             drawgfx(bitmap,Machine->gfx[4],
  287.                     sprite - multi * inc,
  288.                     colour,
  289.                     fx,fy,
  290.                     x,y + mult * multi,
  291.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  292.  
  293.             multi--;
  294.         }
  295.     }
  296. }
  297.  
  298.  
  299. void vaportra_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  300. {
  301.     int pri=READ_WORD(&vaportra_control_2[0]);
  302.     static int last_pri=0;
  303.  
  304.     /* Update flipscreen */
  305.     if (READ_WORD(&vaportra_control_1[0])&0x80)
  306.         flipscreen=0;
  307.     else
  308.         flipscreen=1;
  309.  
  310.     tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  311.  
  312.     /* Update scroll registers */
  313.     tilemap_set_scrollx( pf1_tilemap,0, READ_WORD(&vaportra_control_1[2]) );
  314.     tilemap_set_scrolly( pf1_tilemap,0, READ_WORD(&vaportra_control_1[4]) );
  315.     tilemap_set_scrollx( pf2_tilemap,0, READ_WORD(&vaportra_control_0[2]) );
  316.     tilemap_set_scrolly( pf2_tilemap,0, READ_WORD(&vaportra_control_0[4]) );
  317.     tilemap_set_scrollx( pf3_tilemap,0, READ_WORD(&vaportra_control_1[6]) );
  318.     tilemap_set_scrolly( pf3_tilemap,0, READ_WORD(&vaportra_control_1[8]) );
  319.     tilemap_set_scrollx( pf4_tilemap,0, READ_WORD(&vaportra_control_0[6]) );
  320.     tilemap_set_scrolly( pf4_tilemap,0, READ_WORD(&vaportra_control_0[8]) );
  321.  
  322.     pri&=0x3;
  323.     if (pri!=last_pri)
  324.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  325.     last_pri=pri;
  326.  
  327.     /* Update playfields */
  328.     switch (pri) {
  329.         case 0:
  330.         case 2:
  331.             pf4_tilemap->type=TILEMAP_OPAQUE;
  332.             pf3_tilemap->type=TILEMAP_TRANSPARENT;
  333.             pf2_tilemap->type=TILEMAP_TRANSPARENT;
  334.             break;
  335.         case 1:
  336.         case 3:
  337.             pf2_tilemap->type=TILEMAP_OPAQUE;
  338.             pf3_tilemap->type=TILEMAP_TRANSPARENT;
  339.             pf4_tilemap->type=TILEMAP_TRANSPARENT;
  340.             break;
  341.     }
  342.  
  343.     gfx_bank=1;
  344.     gfx_base=vaportra_pf2_data;
  345.     tilemap_update(pf2_tilemap);
  346.  
  347.     gfx_bank=2;
  348.     gfx_base=vaportra_pf3_data;
  349.     tilemap_update(pf3_tilemap);
  350.  
  351.     gfx_bank=3;
  352.     gfx_base=vaportra_pf4_data;
  353.     tilemap_update(pf4_tilemap);
  354.  
  355.     tilemap_update(pf1_tilemap);
  356.     vaportra_update_palette();
  357.  
  358.     /* Draw playfields */
  359.     tilemap_render(ALL_TILEMAPS);
  360.  
  361.     if (pri==0) {
  362.         tilemap_draw(bitmap,pf4_tilemap,0);
  363.         tilemap_draw(bitmap,pf2_tilemap,0);
  364.         vaportra_drawsprites(bitmap,0);
  365.         tilemap_draw(bitmap,pf3_tilemap,0);
  366.     }
  367.     else if (pri==1) {
  368.         tilemap_draw(bitmap,pf2_tilemap,0);
  369.         tilemap_draw(bitmap,pf4_tilemap,0);
  370.         vaportra_drawsprites(bitmap,0);
  371.         tilemap_draw(bitmap,pf3_tilemap,0);
  372.     }
  373.     else if (pri==2) {
  374.         tilemap_draw(bitmap,pf4_tilemap,0);
  375.         tilemap_draw(bitmap,pf3_tilemap,0);
  376.         vaportra_drawsprites(bitmap,0);
  377.         tilemap_draw(bitmap,pf2_tilemap,0);
  378.     }
  379.     else {
  380.         tilemap_draw(bitmap,pf2_tilemap,0);
  381.         tilemap_draw(bitmap,pf3_tilemap,0);
  382.         vaportra_drawsprites(bitmap,0);
  383.         tilemap_draw(bitmap,pf4_tilemap,0);
  384.     }
  385.  
  386.     vaportra_drawsprites(bitmap,1);
  387.     tilemap_draw(bitmap,pf1_tilemap,0);
  388. }
  389.